home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_AI / AI_081 / CBHD501 / SRC / M2 / SCSICD.M < prev    next >
Text File  |  1998-03-14  |  8KB  |  277 lines

  1. IMPLEMENTATION MODULE ScsiCD;
  2.  
  3. (****************************************************************************
  4.  *
  5.  *
  6.  * $Source: E:\HM2\LIB\se\rcs\scsicd.m,v $
  7.  *
  8.  * $Revision: 1.1 $
  9.  *
  10.  * $Author: S_Engel $
  11.  *
  12.  * $Date: 1996/02/03 19:33:52 $
  13.  *
  14.  * $State: Exp $
  15.  *
  16.  *****************************************************************************
  17.  * History:
  18.  *
  19.  * $Log: scsicd.m,v $
  20.  * Revision 1.1  1996/02/03  19:33:52  S_Engel
  21.  * Initial revision
  22.  *
  23.  *
  24.  *
  25.  ****************************************************************************)
  26.  
  27.  
  28. (* Systemabhängiges *)
  29. (* IMPLEMENTATION FÜR  >>> Hänisch-Modula-2 <<< *)
  30. (*                                              *)
  31. (* Durchgeführt von Steffen Engel               *)
  32. (*                                              *)
  33. (*$S-   Stack-Checks                            *)
  34. (*$I-   keine Variablen-Initialisierung         *)
  35. (*$V-   keine arithmetischen Kontrollen         *)
  36. (*$T-   kein Bereichstest                       *)
  37. (*$Y-   keine Laufzeittests auf RETURN und CASE *)
  38. (*                                              *)
  39. (*----------------------------------------------*)
  40.  
  41. FROM SYSTEM IMPORT ADDRESS, BYTE;
  42.  
  43. FROM Portab IMPORT UChar, Char;
  44.  
  45.  
  46.  
  47. IMPORT SYSTEM, System;
  48.  
  49. (* Standard HM2-Libs *)
  50.  
  51. (* Eigene Libs *)
  52.  
  53. (* Projektlibs *)
  54. IMPORT ScsiIO, Scsi;
  55. FROM Scsi IMPORT Cmd6, Cmd10, Cmd12, SetCmd6, SetCmd10, SetCmd12, SetCmd,
  56.           BlockLen, MaxDmaLen, LogicalUnit;
  57.  
  58.  
  59. (***************************************************************************)
  60. (*-                                                                       -*)
  61. (*- CD-ROM Devices                                                        -*)
  62. (*-                                                                       -*)
  63. (***************************************************************************)
  64.  
  65. PROCEDURE PauseResume(Pause : BOOLEAN) : BOOLEAN;
  66. VAR SCmd            : ScsiIO.tSCSICmd;
  67.  
  68.   BEGIN
  69.     VOID(SetCmd10(Cmd10, 04BH, 0, 0));
  70.     IF Pause
  71.       THEN
  72.         Cmd10.LenLow := 0;
  73.       ELSE
  74.         Cmd10.LenLow := 1;
  75.       END;
  76.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd10, NIL, 0, ScsiIO.DefTimeout)) = 0;
  77.   END PauseResume;
  78.  
  79.  
  80. PROCEDURE PlayAudio10(BlockAdr, TransLength : LONGCARD) : BOOLEAN;
  81. VAR
  82.   SCmd  : ScsiIO.tSCSICmd;
  83.   CmdBlock : ARRAY[0..11] OF CHAR;
  84.  
  85.   BEGIN
  86.     RETURN ScsiIO.In(SetCmd(SCmd,
  87.                       SetCmd10(CmdBlock, 045H, BlockAdr, TransLength)^,
  88.                       NIL, 0, ScsiIO.DefTimeout)) = 0;
  89.   END PlayAudio10;
  90.  
  91. PROCEDURE PlayAudio12(BlockAdr, TransLength : LONGCARD) : BOOLEAN;
  92. VAR SCmd            : ScsiIO.tSCSICmd;
  93.  
  94.   BEGIN
  95.     VOID(SetCmd12(Cmd12, 0A5H, BlockAdr, TransLength));
  96.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd12, NIL, 0, ScsiIO.DefTimeout)) = 0;
  97.   END PlayAudio12;
  98.  
  99. PROCEDURE PlayAudio(BlockAdr, TransLength : LONGCARD) : BOOLEAN;
  100. VAR
  101.   SCmd            : ScsiIO.tSCSICmd;
  102.  
  103.   BEGIN
  104.     IF TransLength > MAX(SHORTCARD)
  105.     THEN
  106.       RETURN PlayAudio12(BlockAdr, TransLength);
  107.     ELSE
  108.       RETURN PlayAudio10(BlockAdr, TransLength);
  109.     END;
  110.   END PlayAudio;
  111.  
  112.  
  113. PROCEDURE PlayAudioMSF(Start, Stop : tMSF) : BOOLEAN;
  114. VAR   Cmd : RECORD
  115.              Code     : BYTE;
  116.              Lun      : BYTE;
  117.              Startmsf : tMSF;
  118.              Stopm    : UChar;
  119.              Stops    : UChar;
  120.              Stopf    : UChar;
  121.              Flags    : BYTE;
  122.            END;
  123. VAR SCmd            : ScsiIO.tSCSICmd;
  124.   BEGIN
  125.     WITH Cmd DO
  126.       Code      := BYTE(47H);
  127.       Lun       := BYTE(0);
  128.       Startmsf  := Start;
  129.       Stopm     := Stop.M;
  130.       Stops     := Stop.S;
  131.       Stopf     := Stop.F;
  132.       Flags     := BYTE(0);
  133.     END;
  134.  
  135.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd, NIL, 0, ScsiIO.DefTimeout)) = 0;
  136.   END PlayAudioMSF;
  137.  
  138.  
  139. PROCEDURE PlayAudioTrack(StartTrack, StartIndex, EndTrack, EndIndex : SHORTCARD) : BOOLEAN;
  140. VAR   Cmd : RECORD
  141.              Code     : BYTE;
  142.              Lun      : BYTE;
  143.              Res2     : BYTE;
  144.              Res3     : BYTE;
  145.              StartTr  : BYTE;
  146.              StartIn  : BYTE;
  147.              Res6     : BYTE;
  148.              StopTr   : BYTE;
  149.              StopIn   : BYTE;
  150.              Flags    : BYTE;
  151.            END;
  152. VAR SCmd            : ScsiIO.tSCSICmd;
  153.   BEGIN
  154.     WITH Cmd DO
  155.       Code    := BYTE(48H);
  156.       Lun     := BYTE(0);
  157.       Res2    := BYTE(0);
  158.       Res3    := BYTE(0);
  159.       StartTr := VAL(BYTE, StartTrack MOD 100H);
  160.       StartIn := VAL(BYTE, StartIndex MOD 100H);
  161.       StopTr  := VAL(BYTE, EndTrack MOD 100H);
  162.       StopIn  := VAL(BYTE, EndIndex MOD 100H);
  163.       Res6    := BYTE(0);
  164.       Flags   := BYTE(0);
  165.     END;
  166.  
  167.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd, NIL, 0, ScsiIO.DefTimeout)) = 0;
  168.   END PlayAudioTrack;
  169.  
  170.  
  171. PROCEDURE PlayAudioRelative(StartTrack : SHORTCARD; RelAdr, Len : LONGCARD): BOOLEAN;
  172. VAR SCmd            : ScsiIO.tSCSICmd;
  173.  
  174.   BEGIN
  175.     VOID(SetCmd12(Cmd12, 0A9H, RelAdr, Len));
  176.     Cmd12.Reserved := VAL(BYTE, StartTrack MOD 100H);
  177.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd12, NIL, 0, ScsiIO.DefTimeout)) = 0;
  178.   END PlayAudioRelative;
  179.  
  180.  
  181. PROCEDURE ReadHeader(MSF : BOOLEAN; BlockAdr : LONGCARD;
  182.                      VAR Mode : BYTE; VAR AbsoluteAdr : tMSF) : BOOLEAN;
  183. VAR Ok : BOOLEAN;
  184.     Data :ARRAY [0..1] OF LONGCARD;
  185. VAR SCmd            : ScsiIO.tSCSICmd;
  186.  
  187.   BEGIN
  188.     VOID(SetCmd10(Cmd10, 044H, BlockAdr, SIZE(Data)));
  189.  
  190.     IF MSF
  191.       THEN
  192.         Cmd10.Lun := BYTE(2);
  193.       END;
  194.  
  195.     Ok := ScsiIO.In(SetCmd(SCmd, Cmd10, SYSTEM.ADR(Data), SIZE(Data), ScsiIO.DefTimeout)) = 0;
  196.  
  197.     Mode := VAL(BYTE, Data[0] DIV 1000000H);
  198.     AbsoluteAdr.long := Data[1];
  199.     RETURN Ok;
  200.   END ReadHeader;
  201.  
  202.  
  203. PROCEDURE ReadSubChannel(MSF, SUBQ : BOOLEAN;
  204.                          SubFormat, Track : SHORTCARD;
  205.                          Data : ADDRESS; Len : SHORTCARD) : BOOLEAN;
  206. VAR Cmd : RECORD
  207.             opcode    : BYTE;
  208.             lun       : BYTE;
  209.             subq      : BYTE;
  210.             subform   : BYTE;
  211.             res       : SHORTCARD;
  212.             track     : BYTE;
  213.             lenhigh   : BYTE;
  214.             lenlow    : BYTE;
  215.             flag      : BYTE;
  216.           END;
  217. VAR SCmd            : ScsiIO.tSCSICmd;
  218.  
  219.   BEGIN
  220.     WITH Cmd DO
  221.       opcode := BYTE(042H);
  222.       IF MSF
  223.         THEN
  224.           lun := BYTE(2);
  225.         ELSE
  226.           lun := BYTE(0);
  227.         END;
  228.       IF SUBQ
  229.         THEN
  230.           subq := BYTE(40H);
  231.         ELSE
  232.           subq := BYTE(0);
  233.         END;
  234.       subform := VAL(BYTE, SubFormat);
  235.       res := 0;
  236.       track := VAL(BYTE, Track);
  237.       lenlow := VAL(BYTE, Len MOD 100H);
  238.       lenhigh := VAL(BYTE, Len DIV 100H);
  239.       flag := BYTE(0);
  240.     END;
  241.  
  242.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd, Data, Len, ScsiIO.DefTimeout)) = 0;
  243.  
  244.   END ReadSubChannel;
  245.  
  246.  
  247. PROCEDURE ReadTOC(MSF : BOOLEAN; StartTrack : SHORTCARD;
  248.                   Buffer : ADDRESS; Len : SHORTCARD) : BOOLEAN;
  249. VAR SCmd            : ScsiIO.tSCSICmd;
  250.  
  251.   BEGIN
  252.     VOID(SetCmd10(Cmd10, 043H, 0, Len));
  253.     IF MSF
  254.       THEN
  255.         Cmd10.Lun := VAL(BYTE, LogicalUnit + 2);
  256.       END;
  257.  
  258.     Cmd10.Reserved := StartTrack;
  259.  
  260.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd10, Buffer, Len, ScsiIO.DefTimeout)) = 0;
  261.  
  262.   END ReadTOC;
  263.  
  264.  
  265. PROCEDURE ToshibaReadDiscInfo(mode : SHORTCARD; VAR BlockAdr : LONGCARD) : BOOLEAN;
  266. VAR SCmd            : ScsiIO.tSCSICmd;
  267.  
  268.   BEGIN
  269.     VOID(SetCmd10(Cmd10, 0C7H, 0, 0));
  270.     Cmd10.Lun := VAL(BYTE, mode+LogicalUnit*020H);
  271.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd10, SYSTEM.ADR(BlockAdr), SIZE(BlockAdr),
  272.                             ScsiIO.DefTimeout)) = 0;
  273.   END ToshibaReadDiscInfo;
  274.  
  275.  
  276. END ScsiCD.
  277.